home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
pascal
/
paslib.zip
/
PASLIB01.INC
< prev
next >
Wrap
Text File
|
1986-05-22
|
31KB
|
801 lines
(*
** PASLIB01.INC
** Pascal function library
** by Robert B. Wooster, May, 1986
**
*)
CONST
IsColor : Boolean = False; {7/4/85}
MaxRow = 25;
MaxCol = 80;
{ screen attributes }
LO_V : Byte = 7; HI_V : Byte = 15; RE_V : Byte = 112;
{ cursor control keys }
SK_HM = 71; SK_UP = 72; SK_PU = 73; SK_LE = 75; SK_RI = 77;
SK_EN = 79; SK_DO = 80; SK_PD = 81; SK_IN = 82; SK_DE = 83;
E_S_C = 27; {6/22/85}
{ function keys }
SK_F1 = 59; SK_F2 = 60; SK_F3 = 61; SK_F4 = 62; SK_F5 = 63;
SK_F6 = 64; SK_F7 = 65; SK_F8 = 66; SK_F9 = 67; SK_F0 = 68;
TYPE
chrset = SET OF Char;
string80 = STRING[80]; {7/3/85}
bigstring = STRING[255];
regtype = RECORD CASE Integer OF
1 : (ax, bx, cx, dx, bp, si, ds, es, fl : Integer);
2 : (AL, AH, BL, BH, CL, CH, DL, DH : Byte);
END;
datetype = RECORD
month : 1..12; day : 1..31; year : 1960..2050;
END;
timetype = RECORD
hour, min, sec : Byte;
END;
scrntype = ARRAY[0..1999] OF RECORD
Ch : Char; At : Byte;
END;
screenptr = ^scrntype;
VAR
EquipFlag : Integer ABSOLUTE $0000 : $0410; {7/4/85}
MonoScreen : scrntype ABSOLUTE $B000 : $0000;
ColorScreen : scrntype ABSOLUTE $B800 : $0000; {7/4/85}
KeyStat : Byte ABSOLUTE $0000 : $0417; {10/29/85}
savedscrn : screenptr;
SplKey : Byte;
sdt : datetype;
out : Text; {6/22/85}
To_LST : Boolean; {6/22/85}
EscFlag : Boolean; {6/22/85}
{---------------------------------------}
{ monitor initialization }
{---------------------------------------}
PROCEDURE InitMonitor; {7/4/85}
BEGIN { initmonitor }
IsColor := (((Lo(EquipFlag) SHR 4) MOD 4) <> 3);
END; { initmonitor }
PROCEDURE SwapMonitors; {7/4/85}
VAR r : regtype;
BEGIN { swapmonitors }
IF (((Lo(EquipFlag) SHR 4) MOD 4) = 3) THEN BEGIN
EquipFlag := EquipFlag-16;
{ note: color monitor set to 80x25 b&w }
r.AH := 0; r.AL := 2; Intr($10, r);
END {if}
ELSE BEGIN
EquipFlag := EquipFlag+16;
r.AH := 0; r.AL := 8; Intr($10, r);
END; {else}
InitMonitor;
END; { swapmonitors }
{==============================================}
{ i/o primitives }
{----------------------------------------------}
FUNCTION ugetc : Char;
{ unbuffered getc, does not echo, ^c breaks }
VAR reg : regtype; c : Char;
BEGIN
SplKey := 0;
WITH reg DO BEGIN
ax := $0000; Intr($16, reg); c := Chr(AL);
SplKey := AH;
END; { with }
IF reg.AL = 3 THEN Halt; {^c}
IF reg.AL = 27 THEN BEGIN
SplKey := 27; {esc} c := Chr(0); {7/5/85}
END;
ugetc := c;
END; { ugetc }
PROCEDURE putc(c : Char; b : Byte); {7/3/85}
{ put character on screen with attribute b}
VAR row, col : Integer;
BEGIN
col := WhereX-1; row := WhereY-1;
IF IsColor THEN BEGIN
ColorScreen[80*row+col].Ch := c;
ColorScreen[80*row+col].At := b;
END {if}
ELSE BEGIN
MonoScreen[80*row+col].Ch := c;
MonoScreen[80*row+col].At := b;
END; {else}
END; { putc }
PROCEDURE aputc(c : Char; a : Byte; col, row : Integer);
{ put character c on screen at col,row with attribute a }
VAR i : Integer;
BEGIN
IF IsColor THEN BEGIN
ColorScreen[80*(row-1)+col-1].Ch := c;
ColorScreen[80*(row-1)+col-1].At := a;
END {if}
ELSE BEGIN
MonoScreen[80*(row-1)+col-1].Ch := c;
MonoScreen[80*(row-1)+col-1].At := a;
END; {else}
END; { putc } {7/3/85}
{==============================================}
{ i/o routines }
{----------------------------------------------}
FUNCTION GetUC(default : Char; okset : chrset) : Char;
{ get a character from the keyboard, if lower case convert to upper }
{ must be character in okset. if cr return default }
CONST CR = 13; ESC = 27;
VAR ok : Boolean; ch : Char;
BEGIN
REPEAT
Write(default, Char(8));
ch := UpCase(ugetc);
IF (ch = Chr(CR)) OR (ch = Chr(ESC)) OR (Ord(ch) = 0)
THEN ch := default;
ok := ch IN okset;
IF NOT ok THEN Write(Chr(7));
UNTIL ok;
Write(ch : 1);
GetUC := ch;
END; { getuc }
PROCEDURE PutString(s : string80; col, row : Integer);
{ put string on crt at indicated position }
BEGIN
GoToXY(col, row); Write(s);
END; { posstr }
PROCEDURE GetString(VAR inpstr : string80;
maxlen, col, row : Integer;
default : string80);
{ get an input string from the keyboard }
CONST BS = 8; { ascii backspace }
CR = 13; { ascii carriage return }
ESC = 27; { ascii escape }
VAR
ch : Char;
i : Integer;
isdefault : Boolean;
code : Byte;
done : Boolean;
FLDCHR : Char; { input field marker }
FUNCTION AddChar(VAR s : string80; c : Char; max : Integer) : Boolean;
{ add a character to the end of string }
BEGIN
IF Length(s) < max THEN BEGIN
s[0] := Succ(s[0]); s[Length(s)] := ch; END; { if }
IF Length(s) = max THEN AddChar := True
ELSE AddChar := False;
END; { addchar }
PROCEDURE ChopChar(VAR s : string80);
{ delete character from end of string }
BEGIN
IF Length(s) > 0 THEN s[0] := Pred(s[0]);
Write(^H); Write(FLDCHR); Write(^H);
IF (Length(s) = 0) AND isdefault THEN BEGIN
PutString(default, col, row);
GoToXY(col, row); END;
END; { chopchar }
BEGIN
FLDCHR := Chr(254);
inpstr := '';
isdefault := Length(default) <> 0;
GoToXY(col, row);
FOR i := 1 TO maxlen DO Write(' ');
IF isdefault THEN PutString(default, col, row)
ELSE BEGIN GoToXY(col, row); {4/27/85}
FOR i := 1 TO maxlen DO Write(FLDCHR);
END;
GoToXY(col, row); done := False;
REPEAT
ch := ugetc;
CASE Ord(ch) OF
0 : done := True; { special key }
CR : done := True; { return }
BS : ChopChar(inpstr); { backspace }
ELSE BEGIN done := AddChar(inpstr, ch, maxlen);
IF isdefault AND (Length(inpstr) = 1) THEN BEGIN
FOR i := 1 TO maxlen DO Write(FLDCHR); GoToXY(col, row);
END;
Write(ch); END; { else }
END; { case }
UNTIL done;
IF isdefault AND (Length(inpstr) = 0) THEN inpstr := default;
GoToXY(col, row); Write(' ' : maxlen);
GoToXY(col, row); Write(inpstr);
END; { getstring }
PROCEDURE PutInteger(anum, col, row, maxlen : Integer); {11/8/85}
{ put integer on crt}
VAR ts : String80;
BEGIN
Str(anum : maxl